home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / prgtools / programm.ing / m2posx10.zoo / m2posix.10 / src / jump.dpp < prev    next >
Encoding:
Modula Definition  |  1994-01-04  |  5.6 KB  |  124 lines

  1. DEFINITION MODULE jump;
  2. __DEF_SWITCHES__
  3. #ifdef HM2
  4. #ifdef __LONG_WHOLE__
  5. (*$!i+: Modul muss mit $i- uebersetzt werden! *)
  6. (*$!w+: Modul muss mit $w- uebersetzt werden! *)
  7. #else
  8. (*$!i-: Modul muss mit $i+ uebersetzt werden! *)
  9. (*$!w-: Modul muss mit $w+ uebersetzt werden! *)
  10. #endif
  11. #endif
  12. (*****************************************************************************)
  13. (* (Kontrollierte) globale Spruenge                                          *)
  14. (* --------------------------------------------------------------------------*)
  15. (* 01-Jan-94, Holger Kleinschmidt                                            *)
  16. (*****************************************************************************)
  17.  
  18. FROM PORTAB IMPORT
  19. (* TYPE *) UNSIGNEDLONG, UNSIGNEDWORD;
  20.  
  21. #ifdef TSM2_1
  22. FROM AsmLib IMPORT LongLabel;
  23. #endif
  24.  
  25. (*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
  26.  
  27. #ifdef TSM2_1
  28. TYPE JmpBuf = LongLabel;
  29. #else
  30. TYPE
  31.   JmpBuf = RECORD
  32. #if (defined LPRM2) || (defined SPCM2)
  33.     regs : ARRAY [0..4] OF UNSIGNEDLONG;  (* PC & A4-A7 *)
  34. #elif (defined MM2)
  35.     regs : ARRAY [0..10] OF UNSIGNEDLONG; (* PC & D3-D7/A3-A7 *)
  36. #elif (defined HM2)
  37.     regs : ARRAY [0..12] OF UNSIGNEDLONG; (* PC & D2-D7/A2-A7 *)
  38. #elif (defined TDIM2)
  39.     regs : ARRAY [0..3] OF UNSIGNEDLONG; (* PC & A5-A7 *)
  40. #elif (defined FTLM2)
  41.     regs : ARRAY [0..3] OF UNSIGNEDLONG; (* PC & A3/A6/A7 *)
  42. #else
  43. #  error *** compiler not (yet) supported
  44. #endif
  45.   END;
  46. #endif /* TSM2 */
  47.  
  48.  
  49. TYPE
  50.   SigJmpBuf = RECORD
  51. #if (defined LPRM2) || (defined SPCM2)
  52.     regs : ARRAY [0..4] OF UNSIGNEDLONG;  (* PC & A4-A7 *)
  53. #elif (defined MM2)
  54.     regs : ARRAY [0..10] OF UNSIGNEDLONG; (* PC & D3-D7/A3-A7 *)
  55. #elif (defined HM2)
  56.     regs : ARRAY [0..12] OF UNSIGNEDLONG; (* PC & D2-D7/A2-A7 *)
  57. #elif (defined TDIM2)
  58.     regs : ARRAY [0..3] OF UNSIGNEDLONG; (* PC & A5-A7 *)
  59. #elif (defined FTLM2)
  60.     regs : ARRAY [0..3] OF UNSIGNEDLONG; (* PC & A3/A6/A7 *)
  61. #else
  62. #  error *** compiler not (yet) supported
  63. #endif
  64.     procmask : UNSIGNEDLONG;
  65.     saved    : UNSIGNEDWORD;
  66.   END;
  67.  
  68. (*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
  69.  
  70.  PROCEDURE setjmp ((* -- /AUS *) VAR env : JmpBuf ): INTEGER;
  71.  
  72.  PROCEDURE longjmp ((* EIN/ -- *) VAR env : JmpBuf;
  73.                     (* EIN/ -- *)     val : INTEGER );
  74.  
  75. (*--------------------------------------------------------------------------
  76.  | Mit diesen beiden Funktionen lassen sich GOTOs realisieren, die z.B. fuer|
  77.  | die Fehlerbehandlung nuetzlich sein koennen. Wenn "setjmp()" zum ersten  |
  78.  | Mal aufgerufen wird, werden in <env> die Inhalte der Prozessorregister   |
  79.  | gespeichert, die benoetigt werden, um wie nach einem Prozeduraufruf in   |
  80.  | der Abarbeitung des Programms fortzufahren; als Funktionswert wird eine  |
  81.  | Null geliefert. Wird jetzt im weiteren Verlauf "longjmp()" mit dem durch |
  82.  | "setjmp()" in <env> gesicherten Kontext aufgerufen, wird die Programmaus-|
  83.  | fuehrung direkt hinter dem zugehoerigen "setjmp()" fortgesetzt, nur das  |
  84.  | als Funktionswert von "setjmp()" jetzt nicht Null, sondern <val> gelie-  |
  85.  | fert wird. Falls <val> ebenfalls Null ist, wird es auf eins korrigiert,  |
  86.  | um auf jeden Fall eine Unterscheidung zum ersten Aufruf von "setjmp()" zu|
  87.  | ermoeglichen.                                                            |
  88.  | "setjmp()" sollte nur in einer Zuweisung oder innerhalb eines einfachen  |
  89.  | Vergleichs aufgerufen werden.                                            |
  90.  | Der ``Block'', in dem "setjmp()" aufgerufen wurde, darf noch nicht ver-  |
  91.  | lassen worden sein, wenn durch "longjmp()" in diesen zurueckgesprungen   |
  92.  | wird. Mit Block sind dabei alle Konstrukte gemeint, die Platz auf dem    |
  93.  | Stack benoetigen, da Werte auf dem Stack nach Verlassen des Blocks mit   |
  94.  | ziemlicher Sicherheit wieder ueberschrieben werden. Somit darf vor allem |
  95.  | nicht in eine Prozedur zurueckgesprungen werden, die bereits verlassen   |
  96.  | wurde, aber z.B. auch nicht in eine bereits verlassene FOR-Schleife (da  |
  97.  | hier evtl. der Schleifenendwert auf dem Stack abgelegt wird) oder eine   |
  98.  | WITH-Anweisung (Sichern von (Address)Registern).                         |
  99.  | "longjmp()" darf nicht zum Verlassen eines Signalhandlers benutzt werden.|
  100.  |                                                                          |
  101.  | GEMDOS/MiNT:                                                             |
  102.  |         Beim Aufruf von "longjmp()" muss sich die CPU im gleichen Modus  |
  103.  |         befinden wie beim Aufruf des dazugehoerenden "setjmp()".         |
  104.  | MiNT:   Bei "longjmp()" wird ein 'Psigreturn' ausgefuehrt.               |
  105.   --------------------------------------------------------------------------*)
  106.  
  107.  
  108.  PROCEDURE sigsetjmp ((* -- /AUS *) VAR env      : SigJmpBuf;
  109.                       (* EIN/ -- *)     savemask : UNSIGNEDWORD ): INTEGER;
  110.  
  111.  PROCEDURE siglongjmp ((* EIN/ -- *) VAR env : SigJmpBuf;
  112.                        (* EIN/ -- *)     val : INTEGER   );
  113.  
  114. (*--------------------------------------------------------------------------
  115.  | Funktion wie "lib.set/longjmp()", jedoch wird, falls <savemask> <> 0,    |
  116.  | die Signalmaske des Prozesses beim Aufruf von "sigsetjmp()" gerettet und |
  117.  | bei "siglongjmp()" wieder restauriert.                                   |
  118.  |                                                                          |
  119.  | GEMDOS: (noch) nicht implementiert                                       |
  120.  |   MiNT: -""-                                                             |
  121.   --------------------------------------------------------------------------*)
  122.  
  123. END jump.
  124.